#!/bin/bash

#******************************************************************************#
#                                                                              #
# MoverT                                                                       #
#                                                                              #
#******************************************************************************#

# Permite mover un archivo de un directorio a otro contemplando la posibilidad de archivos duplicados

#******************************************************************************#
#                                                                              #
# Funciones auxiliares                                                         #
#                                                                              #
#******************************************************************************#

uso()
{
	echo -e "Uso:

./MoverT archivo_origen directorio_destino [comando_invocador [--grabar_log]]

Donde:

comando_invocador:
	Nombre del comando desde el cual se invoca el comando MoverT.
--grabar_log:
	Graba en el log del comando invocador el resultado de la operación. Para los siguientes comandos no es necesario indicar la opción: IniciarT, DetectarT, GrabarParqueT."
}

# Uso: grabar_log_si_corresponde grabar_log comando_invocador tipo_mensaje { mensaje | --id_msj=identificador_mensaje } [ parametro_mensaje_1 parametro_mensaje_2 ... parametro_mensaje_n ]
grabar_log_si_corresponde()
{
if [ "$1" -eq 1 ]
then

	p=("$@")
	unset p[0]
	unset p[1]
	unset p[2]

	"$BINDIR"/LoguearT "$2" "$3" "${p[@]}"
fi
}

# devuelve por salida standard el proximo numero de secuencia que le corresponde a un determinado archivo en un determinado directorio
# uso: nn archivo directorio
nn()
{
# obtengo el mayor numero de secuencia del archivo en el directorio
n=`find "$2" -maxdepth 1 -type f -name "$1.[0-9]*" | sed "s+$2/$1[.]\([0-9]\{1,\}\)+\1+" | sort -n | tail -1`

let "n = n + 1"
echo $n
}

#******************************************************************************#
#                                                                              #
# Main                                                                         #
#                                                                              #
#******************************************************************************#

#------------------------------------------------------------------------------#

# verifico que se hayan pasado los parametros obligatorios
if [ $# -lt 2 ]
then
	echo "Faltan parámetros obligatorios."
	uso
	exit 1
fi

# mapeo parametros a variables
origen=$1
directorio_destino=$2
comando_invocador=$3

# variables auxiliares
directorio_origen=`dirname "$origen"`
archivo_origen=`basename "$origen"`
grabar_log=0

# si se pasaron 4 parametros el cuarto debe ser '--grabar_log'
if [ $# -eq 4 ]
then
	if [ "$4" != "--grabar_log" ]
	then
		echo "Opción incorrecta."
		uso
		exit 1
	else
		grabar_log=1
	fi
fi

#------------------------------------------------------------------------------#

# si el comando invocador es IniciarT, DetectarT o GrabarParqueT se debe grabar en el log
if [ "$comando_invocador" == "IniciarT" -o "$comando_invocador" == "DetectarT" -o "$comando_invocador" == "GrabarParqueT" ]
then
	grabar_log=1
fi

#------------------------------------------------------------------------------#

grabar_log_si_corresponde $grabar_log "$comando_invocador" "I" --id_msj=MPM "$archivo_origen" "$directorio_origen" "$directorio_destino"

#------------------------------------------------------------------------------#

# verifico que:
# el archivo origen exista y sea un archivo regular
# el directorio destino exista y sea un directorio
# el directorio destino no sea igual al directorio origen
if [ ! -f "$origen" ]
then
	echo "El archivo origen no existe o no es un archivo regular."
	grabar_log_si_corresponde $grabar_log "$comando_invocador" "SE" --id_msj=MAONE "$origen"
	exit 1
fi

if [ ! -d "$directorio_destino" ]
then
	echo "El directorio destino no existe o no es un directorio."
	grabar_log_si_corresponde $grabar_log "$comando_invocador" "SE" --id_msj=MDDNE "$directorio_destino"
	exit 1		
fi

if [ "$directorio_destino" == "$directorio_origen" ]
then
	echo "El directorio destino es igual al directorio origen."
	grabar_log_si_corresponde $grabar_log "$comando_invocador" "I" --id_msj=MDDIDO "$directorio_destino" "$directorio_origen"
	exit 1
fi

#------------------------------------------------------------------------------#

# si en el directorio destino existe un archivo con el mismo nombre que el del archivo origen obtengo el nuevo destino
if [ -f "$directorio_destino/$archivo_origen.0" ]
then
	# obtengo el proximo numero de secuencia
	proximo_n=$(nn "$archivo_origen" "$directorio_destino")

	destino="$directorio_destino/$archivo_origen.$proximo_n"
else
	destino="$directorio_destino/$archivo_origen.0"
fi

#------------------------------------------------------------------------------#

# muevo el archivo origen al destino
mensaje_retorno=`mv "$origen" "$destino" 2>&1`

#------------------------------------------------------------------------------#

if [ $? -eq 0 ]
then
	grabar_log_si_corresponde $grabar_log "$comando_invocador" "I" --id_msj=MME "$origen" "$destino"
else
	echo "Mover falló: $mensaje_retorno."
	grabar_log_si_corresponde $grabar_log "$comando_invocador" "SE" --id_msj=MMF "$mensaje_retorno"
fi

#------------------------------------------------------------------------------#

exit $?
